package ua.at.tsvetkov.samizdat.data;

import java.io.File;

import ua.at.tsvetkov.samizdat.Const;
import ua.at.tsvetkov.samizdat.Key;
import ua.at.tsvetkov.samizdat.activities.AcBook;
import ua.at.tsvetkov.application.AppConfig;
import ua.at.tsvetkov.util.Log;
import android.app.Activity;
import android.content.Intent;

public class Book {

	public static final String	CV				= "|";

	public String					object		= "";
	public String					author		= "";
	public String					title			= "";
	public String					type			= "";
	public String					size			= "";
	public String					date			= "";
	public String					ball			= "";
	public String					counter		= "";
	public String					annotation	= "";
	public int						position		= 0;

	public Book() {

	}

	/**
	 * Создает объект инициализируя данными из строки
	 * 
	 * @param str
	 * @throws WrongFieldCountException
	 */
	public Book(String str) throws WrongFieldCountException {
		init(str);
	}

	/**
	 * Создает объект инициализируя данными из строки
	 * 
	 * @param str
	 * @throws WrongFieldCountException
	 */
	public Book(String[] data) throws WrongFieldCountException {
		init(data);
	}

	/**
	 * Подготавливает данные книги для просмотра в AcBook
	 * 
	 * @param activity
	 */
	public void openAcBook(Activity activity) {
		AppConfig.putSetting(Key.CURRENT_BOOK, getFormattedString(), AppConfig.SAVE);
		Intent intent = new Intent(activity, AcBook.class);
		activity.startActivity(intent);
	}

	/**
	 * Заполняет данные по книге из форматированной строки
	 * 
	 * @param str
	 * @throws WrongFieldCountException
	 */
	public void init(String str) throws WrongFieldCountException {
		String[] data = str.split("\\|");
		init(data);
	}

	/**
	 * Заполняет данные по книге из массива
	 * 
	 * @param header
	 * @throws WrongFieldCountException
	 */
	public void init(String[] data) throws WrongFieldCountException {
		if (data.length < Data.BOOK_SIZE)
			throw new WrongFieldCountException();
		for (int i = 0; i < data.length; i++) {
			if (data[i] == null) {
				data[i] = "";
			}
		}
		try {
			this.object = data[Data.BOOK_OBJECT];
			this.author = data[Data.BOOK_AUTHOR];
			this.title = data[Data.BOOK_TITLE];
			this.type = data[Data.BOOK_TYPE];
			this.size = data[Data.BOOK_SIZE];
			this.date = data[Data.BOOK_DATE];
			this.ball = data[Data.BOOK_BALL];
			this.counter = data[Data.BOOK_COUNTER];
			this.annotation = data[Data.BOOK_ANNOT];
			if (data[Data.BOOK_POSITION].trim().length() > 0)
				this.position = Integer.valueOf(data[Data.BOOK_POSITION]);
		} catch (Exception e) {
			Log.w("Позиция не инициализирована", e);
			for (int i = 0; i < data.length; i++) {
				Log.i("[" + i + "]" + data[i]);
			}
		}
	}

	/**
	 * Инициализация из заголовка книги
	 * 
	 * @param data
	 * @throws WrongFieldCountException
	 */
	public void initFromHeader(String str) throws WrongFieldCountException {
		String[] data = str.split("\\|");
		initFromHeader(data);
	}

	/**
	 * Инициализация из заголовка книги
	 * 
	 * @param data
	 * @throws WrongFieldCountException
	 */
	private void initFromHeader(String[] data) throws WrongFieldCountException {
		if (data.length < Data.HEADER_SIZE)
			throw new WrongFieldCountException();
		String url = data[Data.HEADER_URL].trim();
		try {
			this.object = url.substring(url.indexOf("object=") + 7);
		} catch (Exception e) {
			Log.w("Object url is wrong");
		}
		this.author = data[Data.HEADER_AUTHOR].trim();
		this.title = data[Data.HEADER_TITLE].trim();
		this.type = data[Data.HEADER_TYPE].trim();
		this.size = data[Data.HEADER_SIZE].trim();
		this.date = data[Data.HEADER_DATE].trim();
		this.ball = data[Data.HEADER_BALL].trim();
		this.counter = data[Data.HEADER_COUNTER].trim();
		this.annotation = "";
		this.position = 0;
	}

	/**
	 * Возвращает строку с полями разделенными символами "|"
	 * 
	 * @return
	 */
	public String getFormattedString() {
		return object + CV + author + CV + title + CV + type + CV + size + CV + date + CV + ball + CV + counter + CV + annotation + CV + position;
	}

	/**
	 * Возвращает url для загрузки
	 * 
	 * @return
	 */
	public String getUrl() {
		return Const.URL_BOOK + '/' + object;
	}

	/**
	 * Возвращает название файла на диске (если каталога нет, то создает)
	 * 
	 * @return
	 */
	public String getFileName() {
		return getFileName(author, title);
	}

	public long getFileSize() {
		File f = new File(getFileName());
		if (f.exists()) {
			return f.length();
		} else {
			return 0;
		}
	}

	/**
	 * Возвращает название файла для указанного названия и автора книги на диске (если каталога нет, то создает)
	 * 
	 * @return
	 */
	public static String getFileName(String author, String title) {
		author = author.replaceAll("[\\W&&\\D&&\\S]", "");
		title = title.replaceAll("[\\W&&\\D&&\\S]", "");
		String path = Const.PATH_BOOKS + author + File.separator;
		String fileName = title + ".txt";
		File dir = new File(path);
		dir.mkdirs();
		// String result = path + fileName.replaceAll(":", "").replaceAll("*", "").replaceAll("\"", "").replaceAll("?",
		// "").replaceAll("@", "");
		String result = path + fileName;
		return result;
	}

	/**
	 * Удаление книги
	 */
	public void delete() {
		File file = new File(getFileName());
		file.delete();
		String path = Const.PATH_BOOKS + author;
		File dir = new File(path);
		if (dir.isDirectory()) {
			String[] files = dir.list();
			for (int i = 0; i < files.length; i++) {
				if (!files[i].startsWith(".")) {
					return;
				}
			}
			for (int i = 0; i < files.length; i++) {
				if (!files[i].startsWith(".")) {
					file = new File(path + File.separator + files[i]);
					file.delete();
				}
			}
			dir.delete();
		}
	}

	/**
	 * Возвращает размер текста в килобайтах
	 * 
	 * @return
	 */
	public int getSize() {
		int result = 0;
		try {
			 result  = Integer.parseInt(size.replace("k", "").trim());
		} catch (Exception e) {
			Log.w("Ошибка определения размера книги: " + toString());
		}
		return result;
	}

	/**
	 * Сравниевет на идентичность книги
	 * 
	 * @param book
	 * @return
	 */
	public boolean isSimilar(Book book) {
		return getFormattedString().equals(book.getFormattedString());
	}

	/*
	 * (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("Book [object=");
		builder.append(object);
		builder.append(", position=");
		builder.append(position);
		builder.append(", author=");
		builder.append(author);
		builder.append(", title=");
		builder.append(title);
		builder.append(", type=");
		builder.append(type);
		builder.append(", size=");
		builder.append(size);
		builder.append(", date=");
		builder.append(date);
		builder.append(", ball=");
		builder.append(ball);
		builder.append(", counter=");
		builder.append(counter);
		builder.append(", annotation=");
		builder.append(annotation);
		builder.append("]");
		return builder.toString();
	}

}
